home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / datelib.exe / CALCDATE.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  10KB  |  311 lines

  1. static char calcdate_prog[] = "@(#)char *calcdate(char *dat,long diff,char *ergdat) - Datum +/- Zahl";
  2. static char calcdate_ver[]  = "@(#)v1.10/kr ; 20.05.91";
  3. /* calcdate         Rechnen mit Datum
  4. **
  5. ** Autor            Klaus Rath
  6. **
  7. ** Deklaration      char *calcdate(char *datum, long abstand, char *erg);
  8. **
  9. ** Übergabe         Die Funktion erwartet einen String in einem der folgenden
  10. **                  Formate :
  11. **                  tt.mm.[[jj]jj] -- Deutsches Format
  12. **                  mm/tt[/[jj]jj] -- Amerikanisches Format
  13. **                  [jj]jjmmtt     -- Datenbankformat DDB/4
  14. **                  sowie einen long-Wert, dessen Vorzeichen die gewünschte
  15. **                  Operation festlegt.
  16. ** Rückgabe         Zeiger auf ein char-Array erg, daß ausreichend dimensioniert
  17. **                  sein muß - calcdate gibt immer im langen Format zurück.
  18. **                  Für deutsches und amerikanisches Format werden also 11,
  19. **                  fürs DDB/4-Format 9 Zeichen benötigt!
  20. **
  21. ** Anmerkungen      Die Funktion berücksichtigt vollständig Schaltjahre - durch
  22. **                  Aufruf der Funktion 'int schalt_jahr(int jahr)', die dem-
  23. **                  entsprechend mit eingebunden werden muß.
  24. **                  Sollte kein Jahrhundert im Übergabestring angegeben worden
  25. **                  sein, ermittelt die Funktion das Default-Jahrhundert aus
  26. **                  der Systemzeit !
  27. **                  Der Bereich, in dem calcdate arbeiten kann, liegt
  28. **                  zwischen dem 01.01.0000 und dem 31.12.9999 !!!
  29. ** Änderungen       1.00 ; 13.04.91
  30. **                  Erste vollwertige Version
  31. **                  1.10 ; 20.05.91
  32. **                  Anpassung an die Formate tt.mm. und mm/tt, die beide
  33. **                  eine Vorbelegung auch des aktuellen Jahres benötigen.
  34. */
  35.  
  36. #include <stdio.h>
  37. #include <string.h>
  38. #include <time.h>
  39. #ifdef __TURBOC__
  40. #define ANSI
  41. #define MSDOS
  42. #include <stdlib.h>
  43. #include <sys\types.h>
  44. #else
  45. #include <sys/types.h>
  46. #endif
  47. #include "datum.h"
  48.  
  49. #ifdef ANSI
  50. char *calcdate(char *dstring, long abstand, char *erg)
  51. #else
  52. char *calcdate(dstring,abstand,erg)
  53. char *dstring;
  54. long abstand;
  55. char *erg;
  56. #endif
  57. {
  58.     char   tag_s[3],monat_s[3],jahr_s[3],jh_s[3];
  59.     int    tag_z,   monat_z,   jahr_z,   jh_z,   jahreszahl;
  60.     int    format;
  61.     char   systemzeit_s[26];
  62.     time_t systemzeit;
  63.     int    schaltj_jn;
  64.     int    zaehler;
  65.     int    day_of_year  = 0;
  66.     int    rest_of_year = 0;
  67. #ifdef __TURBOC__
  68.     int    mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  69. #else
  70.     int    mlaen[13];
  71.     mlaen[0]  = 0;
  72.     mlaen[1]  = 31;
  73.     mlaen[2]  = 28;
  74.     mlaen[3]  = 31;
  75.     mlaen[4]  = 30;
  76.     mlaen[5]  = 31;
  77.     mlaen[6]  = 30;
  78.     mlaen[7]  = 31;
  79.     mlaen[8]  = 31;
  80.     mlaen[9]  = 30;
  81.     mlaen[10] = 31;
  82.     mlaen[11] = 30;
  83.     mlaen[12] = 31;
  84. #endif
  85.  
  86.     /* Überprüfung auf Gültigkeit bzw. Format :
  87.     */
  88.     format = checkdate(dstring);
  89.     if ( !format ) {
  90.         strcpy(erg,(char *)FALSE);
  91.         return(erg);
  92.     }
  93.  
  94.     /* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
  95.     */
  96.     time(&systemzeit);
  97.     strcpy(systemzeit_s,ctime(&systemzeit));
  98.     jh_s[0] = systemzeit_s[20];
  99.     jh_s[1] = systemzeit_s[21];
  100.     jh_s[2] = '\0';
  101.     jahr_s[0] = systemzeit_s[22];
  102.     jahr_s[1] = systemzeit_s[23];
  103.     jahr_s[2] = '\0';
  104.  
  105.     /* Format überprüfen und umkopieren :
  106.     */
  107.     if ( format == 1 || format == 2 || format == 7 ) {  /* deutsches Format */
  108.         tag_s[0]   = dstring[0];
  109.         tag_s[1]   = dstring[1];
  110.         tag_s[2]   = '\0';
  111.         monat_s[0] = dstring[3];
  112.         monat_s[1] = dstring[4];
  113.         monat_s[2] = '\0';
  114.         if ( format == 2 ) {
  115.             jh_s[0] = dstring[6];
  116.             jh_s[1] = dstring[7];
  117.             jh_s[2] = '\0';
  118.             jahr_s[0] = dstring[8];
  119.             jahr_s[1] = dstring[9];
  120.             jahr_s[2] = '\0';
  121.         }
  122.         else if ( format == 1 ) {
  123.             jahr_s[0] = dstring[6];
  124.             jahr_s[1] = dstring[7];
  125.             jahr_s[2] = '\0';
  126.         }
  127.     } /* ENDE: Deutsches Format */
  128.     else if ( format == 3 || format == 4 || format == 8 ) {  /* am.Format   */
  129.         tag_s[0]   = dstring[3];
  130.         tag_s[1]   = dstring[4];
  131.         tag_s[2]   = '\0';
  132.         monat_s[0] = dstring[0];
  133.         monat_s[1] = dstring[1];
  134.         monat_s[2] = '\0';
  135.         if ( format == 4 ) {
  136.             jh_s[0] = dstring[6];
  137.             jh_s[1] = dstring[7];
  138.             jh_s[2] = '\0';
  139.             jahr_s[0] = dstring[8];
  140.             jahr_s[1] = dstring[9];
  141.             jahr_s[2] = '\0';
  142.         }
  143.         else if ( format == 3 ) {
  144.             jahr_s[0] = dstring[6];
  145.             jahr_s[1] = dstring[7];
  146.             jahr_s[2] = '\0';
  147.         }
  148.     } /* ENDE: Amerikanisches Format */
  149.     else if ( format == 5 || format == 6 ) {              /* Datenbank-Format */
  150.         if ( format == 6 ) {
  151.             jh_s[0]    = dstring[0];
  152.             jh_s[1]    = dstring[1];
  153.             jh_s[2]    = '\0';
  154.             jahr_s[0]  = dstring[2];
  155.             jahr_s[1]  = dstring[3];
  156.             jahr_s[2]  = '\0';
  157.             tag_s[0]   = dstring[6];
  158.             tag_s[1]   = dstring[7];
  159.             tag_s[2]   = '\0';
  160.             monat_s[0] = dstring[4];
  161.             monat_s[1] = dstring[5];
  162.             monat_s[2] = '\0';
  163.         }
  164.         else {
  165.             jahr_s[0]  = dstring[0];
  166.             jahr_s[1]  = dstring[1];
  167.             jahr_s[2]  = '\0';
  168.             tag_s[0]   = dstring[4];
  169.             tag_s[1]   = dstring[5];
  170.             tag_s[2]   = '\0';
  171.             monat_s[0] = dstring[2];
  172.             monat_s[1] = dstring[3];
  173.             monat_s[2] = '\0';
  174.         }
  175.     } /* ENDE: Datenbankformat */
  176.     /* ENDE:if(Formatprüfung und Kopierung) */
  177.  
  178.     /* Konvertierung :
  179.     */
  180.     jh_z       = atoi(jh_s);
  181.     jahr_z     = atoi(jahr_s);
  182.     monat_z    = atoi(monat_s);
  183.     tag_z      = atoi(tag_s);
  184.     jahreszahl = (jh_z*100) + jahr_z;
  185.  
  186.     /* Tag des übergebenen Jahres ermitteln :
  187.     */
  188.     if ( ( schaltj_jn = schalt_jahr(jahreszahl) ) )
  189.         mlaen[2] = 29;
  190.     day_of_year += tag_z;
  191.  
  192.     for ( zaehler = monat_z - 1 ; zaehler > 0 ; zaehler-- )
  193.          day_of_year += mlaen[zaehler];
  194.     if ( schaltj_jn )
  195.         rest_of_year = 366 - day_of_year;
  196.     else
  197.         rest_of_year = 365 - day_of_year;
  198.  
  199.     /* Rückgabeformat auf das passende Langformat einstellen :
  200.     */
  201.     switch ( format ) {
  202.  
  203.       case 1:
  204.       case 2:
  205.       case 7: format = 2;
  206.               break;
  207.       case 3:
  208.       case 4:
  209.       case 8: format = 4;
  210.               break;
  211.       case 5:
  212.       case 6: format = 6;
  213.               break;
  214.      default: format = 2;
  215.     }
  216.  
  217.     /* Aktion ermitteln :
  218.     */
  219.     if ( abstand == 0 ) {
  220.         strcpy(erg,dstring);
  221.         return(erg);
  222.     }
  223.     else if ( abstand > 0 ) {                                    /* Addition */
  224.         /* Sonderfall : aktueller Monat :
  225.         */
  226.         if ( abstand <= mlaen[monat_z] - tag_z ) {     /* im aktuellen Monat */
  227.             strcpy(erg,mk_datestr(tag_z+(int)abstand,monat_z,jahreszahl,format));
  228.             return(erg);
  229.         }
  230.         /* Sonderfall : aktuelles Jahr :
  231.         */
  232.         if ( abstand <= rest_of_year ) {
  233.             abstand -= (mlaen[monat_z] - tag_z);
  234.             for ( zaehler = monat_z+1 ; abstand > mlaen[zaehler] ; zaehler++)
  235.                 abstand -= mlaen[zaehler];
  236.             if ( zaehler == 13 ) {
  237.                 zaehler = 1;
  238.             }
  239.             strcpy(erg,mk_datestr((int)abstand,zaehler,jahreszahl,format));
  240.             return(erg);
  241.         }
  242.         while ( abstand > 0 ) {
  243.             abstand -= rest_of_year;
  244.             jahreszahl++;
  245.             if ( schalt_jahr(jahreszahl) ) {
  246.                 rest_of_year = 366;
  247.                 mlaen[2]     = 29;
  248.             }
  249.             else {
  250.                 rest_of_year = 365;
  251.                 mlaen[2]     = 28;
  252.             }
  253.             if ( abstand <= rest_of_year ) {
  254.                 for ( zaehler = 1 ; abstand > mlaen[zaehler] ; zaehler++ )
  255.                      abstand -= mlaen[zaehler];
  256.                 if ( zaehler == 13 )
  257.                     zaehler = 1;
  258.